#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<string.h>
#include"thread.h"

#include"reactor.h"

Thread::Thread()
{
    if(pthread_create(&m_tid,NULL,taskFunc,this))//这里不能直接传参数，函数形参默认有this指针，类型不匹配 解决方法：写成静态，就没有this指针
    {
        LOG_ERROR<<"cteate thread failed";
    }
    if(-1==socketpair(AF_UNIX,SOCK_STREAM,0,m_channel))//channel就是主线程和子线程之间的管道,每一个线程都有SocketPair
    {
        LOG_ERROR<<strerror(errno);
    }
}

Thread::~Thread()
{
    pthread_join(m_tid,NULL);
}
int Thread::GetSocketPairFirst()const
{
    return m_channel[0];
}
int Thread::GetSocketPairSecond()const
{
    return m_channel[1];
}
pthread_t Thread::GetTid()const
{
    return m_tid;
}

//
void* Thread::taskFunc(void* arg)
{
    Thread* thread=static_cast<Thread*>(arg);
    thread->m_reactor=new Reactor();

    //当                                     此fd上有                   这两个其中之一的事件发生时   就调用此回调函数
    thread->m_reactor->AddEventAndHander(thread->GetSocketPairSecond(),EV_READ|EV_PERSIST,Thread::SocketPairEventCallBack,arg);
    LOG_INFO<<thread->GetTid();
    thread->m_reactor->Loop();
    return NULL;
}

void Thread::SocketPairEventCallBack(int fd,short events,void*arg)
{
    Thread* thread=static_cast<Thread*>(arg);
    int cfd=0;
    //根据这个fd又收了一个cfd
    if(read(fd,&cfd,4)<=0)
    {
        LOG_ERROR<<strerror(errno);
    }
    //现在根据这个cfd去看是否有时间发生        当有事件发生时        调用这个回调函数进行具体的处理
    thread->m_reactor->AddEventAndHander(cfd,EV_READ|EV_PERSIST,Thread::ClientIOEventCallBack,arg);
}


//真正进行通信的fd
void Thread::ClientIOEventCallBack(int fd,short events,void*arg)
{
    char buf[LARGE_BUF_LEN]={0};//消息就在这
    if(read(fd,buf,LARGE_BUF_LEN)<=0)
    {
        LOG_INFO<<"client disconneted!";
    }
    LOG_INFO<<buf;
    //拿到消息之后，先解码
}

// int main()
// {
//     Thread t;
//     //t.join();
//     sleep(3);
//     return 0;
// }